/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.examat.web.controladores;

import java.io.Serializable;
import java.util.ArrayList;
import javax.annotation.Resource;
import javax.enterprise.context.SessionScoped;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;
import org.examat.entidades.Alumno;
import org.examat.web.controladores.util.Sesiones;

/**
 *
 * @author Jorge
 */

@Named
@SessionScoped
public class ExamenEvaluator
    implements Serializable
{
    @Inject
    private ExamenManager exMg;
    @PersistenceContext
    private EntityManager em;
    @Resource
    private UserTransaction utx;
    
    private double calificacion;
    
    /**
     * Califica el examen y deja la calificación en la variable con ese nombre
     * que tienen un getter para mayor comodidad
     */
    public String calificaExamen()
    {
        ArrayList< ArrayList< Integer> > orden = exMg.getOrden();
        ArrayList<Integer> eleccion = exMg.getEleccion();
        
        double suma = 0.0;
        
        for(int i = 0; i < eleccion.size(); i++){
            if(eleccion.get(i) >= 0){
                // si es correcta se suma 1, si no se resta un cuarto de punto
                if( orden.get(i).get( eleccion.get(i) ) == 0)
                    suma += 1.0;
                else
                    suma -= 0.25;
            }
        }
        
        calificacion = suma / eleccion.size() * 10;
        
        this.guardaCalificacion();
        
        return this.getVista();
    }
    
    public String getCalificacion()
    {
        Alumno al = em.find(Alumno.class, (Integer)Sesiones.get("user_claveunica"));
        this.calificacion = (double)al.getCalificacion();
        return String.format("%.2f", this.calificacion);
    }
    
    public String getResultado()
    {
        String ret;
        this.getCalificacion();
        if(this.calificacion>=6.0)
            ret = "Acreditado";
        else
            ret = "N/A";
        
        return ret;
    }
    
    private void guardaCalificacion()
    {
        Alumno al = this.exMg.getAlumno();
        if(al!=null) {
            al.setCalificacion((float)this.calificacion);
            try {
                utx.begin();
                em.joinTransaction();
                em.merge(al);
                utx.commit();
                System.out.println("Calificacion de " +al.getClaveUnica() +" guardada exitosamente");
            }
            catch(Exception e1) {
                try {
                    System.err.print("La operacion de guardar calificación falló. Rollback... ");
                    utx.rollback();
                    System.err.println("OK");
                    System.err.println(e1.getMessage());
                }
                catch(Exception e2) {
                    System.err.println("NO!");
                    System.err.println(e2.getMessage());
                }
            }
        }
    }
    
    public String getVista()
    {
        return "resultado";
    }
}
